.DEFAULT=build
.PHONY=stream
.SECONDEXPANSION:

LEARNER-Bayes := "moa.classifiers.bayes.NaiveBayes"
LEARNER-VFDT := "moa.classifiers.trees.HoeffdingTree"
LEARNER-VFDTAdaptive := "moa.classifiers.trees.HoeffdingAdaptiveTree"
LEARNER-Bagging := "moa.classifiers.meta.OzaBag -s 10"
LEARNER-AUE := "moa.classifiers.meta.AccuracyUpdatedEnsemble -c 1000"
LEARNER-SERA := "moa.classifiers.JanStaniewicz.SERA -c 1000"

ATTRIBUTES := 5
INSTANCES ?= 100000
WINDOW_SIZE ?= 1000
SAMPLE_FREQUENCY ?= 100

build:
	@mkdir -p moa/bin
#	@javac -cp "moa.jar:commons-math3-3.6.1.jar" -d moa/bin moa/src/moa/evaluation/*.java moa/src/moa/streams/generators/*.java moa/src/moa/classifiers/JanStaniewicz/helpers/*.java moa/src/moa/classifiers/JanStaniewicz/*.java
#   For Windows users:
	@javac -cp "moa.jar;commons-math3-3.6.1.jar" -d moa/bin moa/src/moa/evaluation/*.java moa/src/moa/streams/generators/*.java moa/src/moa/classifiers/JanStaniewicz/helpers/*.java moa/src/moa/classifiers/JanStaniewicz/*.java

stream:
#	java -cp "moa.jar:moa/bin" -javaagent:sizeofag.jar moa.DoTask "WriteStreamToARFFFile -s ($(GENERATOR)) -f $(FILE) -m $(INSTANCES)"
#   For Windows users:
	java -cp "moa.jar;moa/bin" -javaagent:sizeofag.jar moa.DoTask "WriteStreamToARFFFile -s ($(GENERATOR)) -f $(FILE) -m 100000"

evaluate:
	@mkdir -p predictions/
	@rm -rf $(PRED-OUTPUT)
#	java -cp "moa.jar:moa/bin:commons-math3-3.6.1.jar" -javaagent:sizeofag.jar moa.DoTask "EvaluatePrequential -l ($(LEARNER)) -e (ImbalancedPerformanceEvaluator -w $(WINDOW_SIZE)) -f $(SAMPLE_FREQUENCY) -s (ArffFileStream -f $(INPUT)) -o $(PRED-OUTPUT)" > $(OUTPUT)
#   For Windows users:
	java -cp "moa.jar;moa/bin;commons-math3-3.6.1.jar" -javaagent:sizeofag.jar moa.DoTask "EvaluatePrequential -l ($(LEARNER)) -e (ImbalancedPerformanceEvaluator -w $(WINDOW_SIZE)) -f $(SAMPLE_FREQUENCY) -s (ArffFileStream -f $(INPUT)) -o $(PRED-OUTPUT)" > $(OUTPUT)

evaluate-test: streams/Test.arff
	make evaluate LEARNER=$(LEARNER-Bayes) INPUT="streams/Test.arff" OUTPUT="test.csv"

streams:
	@mkdir -p streams

streams/Ratio5050.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 1 -m 0.5 -p 0.0 -b 0.0 -o 0.0 -u" FILE=$@

streams/Ratio1090.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 1 -m 0.1 -p 0.0 -b 0.0 -o 0.0 -u" FILE=$@

streams/Ratio0595.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 1 -m 0.05 -p 0.0 -b 0.0 -o 0.0 -u" FILE=$@

streams/Ratio0199.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 1 -m 0.01 -p 0.0 -b 0.0 -o 0.0 -u" FILE=$@

streams/Disjuncts2.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 2 -m 0.1 -s 1.0 -b 0.0 -p 0.0 -o 0.0 -u" FILE=$@

streams/Disjuncts3.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 3 -m 0.1 -s 1.0 -b 0.0 -p 0.0 -o 0.0 -u" FILE=$@

streams/Disjuncts5.arff: streams
	@make stream GENERATOR="generators.ImbalancedGenerator -a $(ATTRIBUTES) -n 5 -m 0.1 -s 1.0 -b 0.0 -p 0.0 -o 0.0 -u" FILE=$@

streams/MinMaj.arff: streams
	@make stream GENERATOR="generators.ImbalancedDriftGenerator -a $(ATTRIBUTES) -n 1 -m 0.05 -p 0.0 -b 0.0 -o 0.0 -u -d 'minority-share/sudden,value-start=1.0,value-end=19.0,start=50000'" FILE=$@

streams/AppearingDisjuncts2.arff: streams
	@make stream GENERATOR="generators.ImbalancedDriftGenerator -a $(ATTRIBUTES) -n 2 -m 0.1 -p 0.0 -b 0.0 -o 0.0 -u -d 'appearing-clusters/incremental,value-start=1.0,value-end=2.0,start=30000,end=40000'" FILE=$@

streams/AppearingDisjuncts3.arff: streams
	@make stream GENERATOR="generators.ImbalancedDriftGenerator -a $(ATTRIBUTES) -n 3 -m 0.1 -p 0.0 -b 0.0 -o 0.0 -u -d 'appearing-clusters/incremental,value-start=1.0,value-end=3.0,start=30000,end=50000'" FILE=$@

streams/AppearingDisjuncts5.arff: streams
	@make stream GENERATOR="generators.ImbalancedDriftGenerator -a $(ATTRIBUTES) -n 5 -m 0.1 -p 0.0 -b 0.0 -o 0.0 -u -d 'appearing-clusters/incremental,value-start=1.0,value-end=5.0,start=30000,end=70000'" FILE=$@

streams/SuddenRatioChange.arff: streams
	@make stream GENERATOR="ConceptDriftRealStream -s (generators.SEAGeneratorIm -f 1 -r 1 -b) -d (ConceptDriftRealStream -s (generators.SEAGeneratorIm -f 1 -r 100 -b) -d (ConceptDriftRealStream -s (generators.SEAGeneratorIm -f 1 -r 10 -b)   -d (generators.SEAGeneratorIm -f 1 -r 1 -b) -w 50 -p 25000 ) -w 50 -p 25000 ) -w 50 -p 25000" FILE=$@

streams/GradualRatioChange.arff: streams
	@make stream GENERATOR="generators.HyperplaneGeneratorIm -c 2 -k 5 -t 0 -r 100 -b -g 500 -l 99900" FILE=$@
	
streams/Air.arff: streams
	@cp streams-real/Air.arff streams/Air.arff
	
streams/Elec.arff: streams
	@cp streams-real/Elec.arff streams/Elec.arff
	
streams/KDDCup.arff: streams
	@cp streams-real/KDDCup.arff streams/KDDCup.arff

streams/PAKDD.arff: streams
	@cp streams-real/PAKDD.arff streams/PAKDD.arff
	
evaluations:
	@mkdir -p evaluations

evaluations/%: evaluations streams/%.arff
	@mkdir -p $@

evaluations/%.csv: $$(@D)
	@make evaluate LEARNER=$(LEARNER-$(*F)) INPUT="streams/$(word 2, $(subst /, , $(@D))).arff" OUTPUT=$@ PRED-OUTPUT=predictions/$(*D)-$(*F).csv

evaluate-all: evaluate-real evaluate-safe evaluate-safe-cluster evaluate-minority-majority evaluate-appearing-clusters evaluate-ratio-change

evaluate-safe: $(shell echo evaluations/{Ratio5050,Ratio1090,Ratio0595,Ratio0199}/{Bayes,VFDT,Bagging,AUE,VFDTAdaptive,SERA}.csv)

evaluate-safe-cluster: $(shell echo evaluations/{Disjuncts2,Disjuncts3,Disjuncts5}/{Bayes,VFDT,Bagging,AUE,VFDTAdaptive,SERA}.csv)

evaluate-minority-majority: $(shell echo evaluations/MinMaj/{Bayes,VFDT,Bagging,AUE,VFDTAdaptive,SERA}.csv)

evaluate-appearing-clusters: $(shell echo evaluations/{AppearingDisjuncts2,AppearingDisjuncts3,AppearingDisjuncts5}/{Bayes,VFDT,Bagging,AUE,VFDTAdaptive,SERA}.csv)

evaluate-ratio-change: $(shell echo evaluations/{SuddenRatioChange,GradualRatioChange}/{Bayes,VFDT,Bagging,AUE,VFDTAdaptive,SERA}.csv)

evaluate-real: $(shell echo evaluations/{Air,Elec,KDDCup,PAKDD}/{Bayes,VFDT,Bagging,AUE,VFDTAdaptive,SERA}.csv)

clean-evaluations:
	@rm -rf evaluations/* test.csv

clean-streams:
	@rm -rf streams/*

clean-predictions:
	@rm -rf predictions/*

clean: clean-streams clean-evaluations clean-predictions

help:
	@echo "USAGE:"
	@echo "make - compile MOA classes"
	@echo "make visualize - generate visualizations for test streams"
	@echo "make evaluate-all - evaluate all learners"
	@echo "make clean - remove all streams, evaluations and visualizations"
